package fun.anin.aninhongbao.util;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import fun.anin.aninhongbao.result.IPInfo;

import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/***
 * ip相关工具
 * @Auther: anin
 * @Date: 2019/9/23 17:08
 * @version : V1.0
 */
public class IPUtils {

    /**
     * 根据Request对象获取ip信息
     *
     * @param req
     * @return
     */
    public static IPInfo getIPMsg(HttpServletRequest req) {
        String ip = getIpAddress(req);
        if (ip.startsWith("0")) {
            return IPInfo.builder().ip(ip).build();
        }
        JSONObject obj = getIPMsg(ip);
        JSONObject obj2 = (JSONObject) obj.get("data");
        Integer code = (Integer) obj.get("code");
        if (code == 0) {
            return IPInfo
                    .builder()
                    .ip(ip)
                    .country(obj2.get("country") + "")
                    .region(obj2.get("region") + "")
                    .city(obj2.get("city") + "")
                    .isp(obj2.get("isp") + "")
                    .build();
        } else {
            return null;
        }
    }

    /**
     * 根据ip获得地区信息
     *
     * @param ip
     * @return
     */
    public static JSONObject getIPMsg(String ip) {
        JSONObject obj = null;
        try {
            String str = getJsonContent("http://ip.taobao.com/service/getIpInfo.php?ip=" + ip);
            obj = JSONUtil.parseObj(str);
        } catch (Exception e) {
            e.printStackTrace();
            obj = JSONUtil.parseObj("{'code':'500','msg':'获取IP地址异常 " + e.getMessage() + "}");
        }
        return obj;
    }

    /**
     * 请求
     *
     * @param urlStr
     * @return
     */
    public static String getJsonContent(String urlStr) {
        try {
            // 获取HttpURLConnection连接对象
            URL url = new URL(urlStr);
            HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
            // 设置连接属性
            httpConn.setConnectTimeout(3000);
            httpConn.setDoInput(true);
            httpConn.setRequestMethod("GET");
            // 获取相应码
            int respCode = httpConn.getResponseCode();
            if (respCode == 200) {
                return ConvertStream2Json(httpConn.getInputStream());
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 根据request获取ip地址
     *
     * @param request
     * @return
     */
    public static String getIpAddress(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }

    private static String ConvertStream2Json(InputStream inputStream) {
        String jsonStr = "";
        // ByteArrayOutputStream相当于内存输出流
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        // 将输入流转移到内存输出流中
        try {
            while ((len = inputStream.read(buffer, 0, buffer.length)) != -1) {
                out.write(buffer, 0, len);
            }
            // 将内存流转换为字符串
            jsonStr = new String(out.toByteArray());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return jsonStr;
    }
}
